package design.aopdemo.aop;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;

@Order(3)
@Aspect
public class AopAspect {
    /**
     * execution：表示执行方法的时候会触发
     * * ：表示任意返回类型的方法
     * (..)：任意参数
     *
     * 生效方法：
     * 1.在切面类上指定@Component类装配
     * 2.在启动类上面使用@EnableAspectJAutoProxy
     */
    //前置通知，在调用对象之前调用
    @Before("execution(* design.aopdemo.controller.AopController.show(..))")
    public void before(){
        System.out.println("before1------");
    }

    //后置通知，在调用之后通知
    @After("execution(* design.aopdemo.controller.AopController.show(..))")
    public void after(){
        System.out.println("after1------");
    }

    //返回通知，在被调用代理方法正常之后调用
    @AfterReturning("execution(* design.aopdemo.controller.AopController.show(..))")
    public void afterReturning(){
        System.out.println("afterReturning1------");
    }

    //异常通知，在被代理方法调用出现异常之后被调用
    @AfterThrowing("execution(* design.aopdemo.controller.AopController.show(..))")
    public void afterThrowing(){
        System.out.println("afterThrowing1------");
    }

    @Around("execution(* design.aopdemo.controller.AopController.show(..))")
    public void around(ProceedingJoinPoint proceedingJoinPoint){
        System.out.println("around before1");
        try{
            proceedingJoinPoint.proceed();
        }catch(Throwable throwable){
            throwable.printStackTrace();
        }
        System.out.println("around after1");
    }
}
